{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf270
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\margl1440\margr1440\vieww10880\viewh10860\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\f0\b\fs28 \cf0 Beschrijving Protocol\

\b0\fs24 \

\i\b\fs26 Algemeen
\i0\b0\fs24 \
Iedere laag in de protocol stack implementeert de IProtocol interface. Dit is gedaan om hogere vorm van abstractie te bereiken. Elke laag moet 'onafhankelijk' van de overige lagen kunnen functioneren. Hierdoor is het alleen mogelijk om de protocol stack te open of te sluiten. Daarnaast worden tussen de protocol lagen reeksen aan bytes uitgewisseld. Deze reeksen van bytes bestaat uit de PDU van die laag en de aangeleverde data uit de bovenste laag.\
\
In onderstaand document wordt de protocol stack van boven naar beneden besproken; beginnende bij de applicatie laag.\
\
Menige zullen opmerken dat de protocol stack sterk overeenkomt met de protocol stack van TCP/IP. In feite wordt hier een uitgeklede protocol stack van TCP/IP besproken die aangepast is om op de EyeNodes te functioneren.\
\

\i\b\fs26 Application Layer\

\i0\b0\fs24 De application layer bestaat uit het gebruikersprogramma. De applicatie maakt een nieuwe instantie van de Protocol aan. Daarbij wordt de gebruikte seri\'eble poort doorgegeven aan de constructor van Protocol. Hierdoor is het mogelijk om meerdere EyeNodes vanuit \'e9\'e9n programma aan te spreken; mits deze aangesloten zijn op verschillende seri\'eble poorten op de computer waar het programma draait.\
\
Nadat de instantie van de Protocol aangemaakt is kan het protocol geopend en gesloten worden.  Zodra het protocol succesvol geopend is kan beginnen worden met het verzenden en ontvangen van gebruikersgegevens.\
\
Het verzenden en ontvangen van gebruikersgegevens geschied via de methoden send() en recv(). Het aanleveren van de gebruikersgegeven wordt gedaan door een reeks van bytes en de lengte van de reeks aan bytes. 
\i \ul NOTE
\b \ulnone :
\i0\b0  Deze gegevens zouden eventueel ook via een structure gedaan kunnen worden. Hierbij verwijs ik naar de datagram class van een datagram socket in Java. Daarnaast moet ook het adres van de ontvanger opgegeven worden; ook dit kan via een simpele referentie (String of integer) of via een 
\i structure
\i0  gebeuren.\
Ontvangen van gebruikersgegeven geschied op dezelfde manier via de methode recv(). Bij het gebruik van een structure kan ook de verzender in de structure opgenomen worden; handig voor het terugsturen van gebruikersgegevens ;-)\
\

\i\b\fs26 Protocol\

\i0\b0\fs24 Het protocol layer heeft een beperkte functionaliteit. In feite kan deze laag het best omschreven worden al doorgeefluik van gebruikersgegevens. De hoofdtaak van het protocol layer is het opbouwen van de onderliggende protocol stack. De constructor van het protocol layer accepteert een referentie naar de seri\'eble poort waar de EyeNode zich bevindt.\
Het voordeel van het gebruik van het protocol layer is dat de eindgebruiker (bijvoorbeeld de programmeur) afgeschermd wordt van de opbouw van de protocol stack.\
\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i \cf0 \ul \ulc0 Functionaliteit:\

\i0 \ulnone - Opbouwen van de protocol stack; denk aan: new TransportLayer(new NetworkLayer(new EyeNode(arg[0])))\
- Doorgeven van gebruikersdata aan de omliggende lagen; zonder hier data aan toe te voegen of te verwijderen (const!!)\
\

\i \ul PDUs:\

\i0 \ulnone n.v.t\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i \cf0 \

\b Transport Layer
\i0\b0 \
De transport layer is vergelijkbaar met de transport layer in een TCP/IP stack. Dit is het punt waar TCP zijn werk doet; denk aan time-outs, crc-checks, hertransmissies, acknowledgements, en dergelijke. \
\
De constructor van de transport layer verwacht een netwerk layer. De netwerk layer wordt gebruikt om gebruikersgegevens met header informatie voorgevoegd door te sturen. Grote hoeveelheden gebruikersgegevens moeten opgesplitst worden in segmenten. Deze segmenten (MSS) hebben een grootte kleiner aan de MTU van de onderliggende link; in dit geval zal dat 253 bytes zijn.\
\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i \cf0 \ul Functionaliteit:\

\i0 \ulnone - Het opsplitsen van gebruikersgegevens in segmenten\
- Het bufferen van segmenten (out-of-order delivery)\
- Het terugsturen van acknowledgements (
\i \ul NOTE: er zijn geen NACKs!!
\i0 \ulnone )\
- Het afhandelen van time-outs van uitstaande segmenten (minstens twee keer de round-trip-time; estimate RTT)\
- CRC-check over de gebruikersgegevens in de segmenten (en de header van een segment?)\
- Discarding van foutieve pakketten of reeds ontvangen pakketten (zie sliding window)\

\i \ul \
PDUs:\

\i0 \ulnone - Sequentienummer : 16 bits (will wrap around eventually)\
- Acknowledgement : 16 bits (piggy-back als in TCP)\
- options field : 8 bits [SYN, FIN, ACK]\
- data length\
- CRC-checksum : 16 of 32 bits\
\

\i \ul Implementatie:\

\i0 \ulnone - Maak gebruik van een sliding window om uitstaande, verzonden, ontvangen en beschikbare pakketten te markeren.\
\
\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i\b \cf0 Network Layer\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i0\b0 \cf0 De netwerklaag zorgt voor het versturen van gegevens naar de EyeNode en het ontvangen van gegevens vanuit de EyeNode. Hierbij wordt onderscheidt gemaakt tussen verschillende type services; zoals de routing service of segment service.\
\
\

\i \ul Functionaliteit:\

\i0 \ulnone - (de)multiplexing van verschillende type services\
- het opzoeken van adressen in de routingtabel\
- het doorgeven van type berichten aan de juiste lagen [Transportlaag of Routing]\
- het doorsturen van pakketen [multihop]\
\
\

\i \ul PDUs:\

\i0 \ulnone - destination address : 16 bits\
- next hop address : 16 bits [
\i\b NOTE:
\i0\b0  waarschijnlijk niet nodig!! Is toegevoegd om massale doorsturen van alle EyeNodes te voorkomen]\
- source address : 16 bits\
\
- payload length: 8 bits [MAX: 253 bytes - HEADER!!]\
- time-to-live : 8 bits
\i \ul \

\i0 \ulnone \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
\cf0 - type of service : 4 bits [Routing, Segment, etc]\
- options field (voor eventuele urgent option etc) : 4 bits\
\
- header checksum : 8 bits\
\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i \cf0 \ul Implementatie:\

\i0 \ulnone Bij het verzenden van een segment uit de transportlaag wordt het adres van de eerstvolgende EyeNode in de routingtabel opgezocht; daarna wordt het pakket aan de EyeNode overhandigd.\
Bij het ontvangen moet gecontroleerd worden of het pakket voor deze EyeNode bestemd is; er zijn meerdere mogelijkheden.\
De EyeNode ontvangt een pakket met in de destination address field zijn identificatienummer. Dit pakket is dan voor deze EyeNode bestemd en moet afgehandeld worden. Daarbij kan het pakket van het type segment zijn dat doorgegeven moet worden aan de Transportlaag. Bij een pakket van een type routing zal het pakket aan de routing laag doorgegeven moeten worden.\
De EyeNode ontvangt een pakket met in de next hop address field zijn identificatienummer. Dan moet de EyeNode zijn routingtabel raadplegen om het adres van zijn volgende hop richting het destination address op te vragen; daarna kan het pakket met gewijzigde next hop address field opnieuw verstuurd worden.\
De EyeNode ontvangt een pakket met in de destination address field of next hop address field met als adres het broadcast adres. Dit ontvangen pakket moet dan opgehandeld worden en doorgestuurd worden; [
\i\b NOTE:
\i0\b0  hoe voorkom je dat het netwerk overspoeld wordt met broadcast pakketen. Dit zou de TTL field op kunnen lossen]\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural

\i\b \cf0 NOTE:
\i0\b0  bij het doorsturen van een pakket moet de TTL met \'e9\'e9n verlaagd worden. Bij het ontvangen van een pakket met TTL < 1 kan het pakket of afgehandeld worden door de node als het aan deze geadresseerd is, of anders kan het genegeerd worden.\
\

\i\b Routing
\i0\b0 \
\
Stuurt routing informatie naar buren toe; dat is, een pakket versturen op broadcast address met de time-to-live op \'e9\'e9n ingesteld. Zo bereikt het pakket alleen de EyeNodes in het verzendbereik van de EyeNode.\
\
Zij gegeven, een 
\i \ul t\ulnone uple van \ul <NodeAddress, Integer>
\i0 \ulnone , waar het NodeAddress een netwerkadres van een EyeNode is en Integer het aantal hops om die EyeNode te bereiken.\
\
Het pakket bestaat uit een lijst met tuples van EyeNodes die bereikbaar zijn vanuit die EyeNode en het aantal hops om die EyeNodes te bereiken. Eventueel kan de NodeAddress van de verzendende EyeNode uit het pakket gehaald worden; dit betekend dat de verzendende EyeNode in \'e9\'e9n hop bereikbaar is. Er kan ook voor gekozen worden om deze informatie als tuple in de lijst op te nemen, met hopcount gelijk aan nul.\
\
Bij ontvangst van het pakket wordt de lokale lijst met tuples bijgewerkt. De hopcount in de tuples moet daarvoor met \'e9\'e9n verhoogd worden. Daar zijn twee opties voor mogelijk:\
\
1] De lijst met tuples wordt aangevuld en bijgewerkt.\
2] De lijst met tuples wordt zo opgesteld dat alleen de paden met minimale hopcount bewaard blijven.\
\
Het eerste alternatief staat toe om een pakket over meerdere paden te sturen. Tevens zorgt de geschiedenis ervoor dat er aan alternatief pad gevonden kan worden mocht een pad geschrapt worden.\
Het tweede alternatief zorgt voor minder gebruik van geheugen. Het doorsturen van de routing informatie wordt daardoor ook aanzienlijk minder.\
\
\
\
\
\
\
\
\
\
}